﻿using Interface.DAO;
using JMI_Nucleo.Classe;
using JMI_Nucleo.Enumerador;
using JMI_Nucleo.JMIProvider;
using OR;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Dao
{
    public class PerfilDao : IPerfilDao<mPerfil>
    {
        private mPerfil infoPerfil;
        private short codigo;

        public PerfilDao()
        {
        }

        #region Comando SQL
        const string cmdInsertSQL = @"INSERT INTO cadastro.perfil(datacadastro, empresa, usuario, dataalteracao, ativo, codigo, descricao)
                                      VALUES(@datacadastro, @empresa, @usuario, @dataalteracao, @ativo, @codigo, @descricao)";

        const string cmdUpdateSQL = @"UPDATE cadastro.perfil SET usuario=@usuario, dataalteracao=@dataalteracao, ativo=@ativo, descricao=@descricao ";

        const string cmdDeleteSQL = @"DELETE FROM cadastro.perfil ";

        const string cmdSelectSQL = @"SELECT datacadastro, empresa, usuario, dataalteracao, ativo, codigo, 
                                       descricao FROM administrativo.perfil ";
        #endregion

        public short Codigo
        {
            get { return codigo; }
            set { codigo = value; }
        }

        #region Metodos Publicos
        bool IPerfilDao<mPerfil>.Inserir(mPerfil infoPerfil)
        {
            bool sucesso = false;
            try
            {
                DbCommand _cmd = EngineBD.GetConexao.CreateCommand();

                _cmd.CommandType = CommandType.Text;
                _cmd.CommandText = cmdInsertSQL;
                GeraParametro(ref _cmd, infoPerfil, 1);
                _cmd.Prepare();

                sucesso = EngineBD.ExecuteNonQuery(_cmd);                
            }
            catch (Exception ex)
            {
                #region Grava log local
                mLog _info = new mLog();
                _info._TipoErro = TipoErro.Erro;
                _info.Mensagem = "Erro ao executar comando. " + ex.Message;
                _info.Metodo = " bool IPerfilDao<mPerfil>.Inserir(mPerfil infoPerfil)";
                _info.StackTrace = ex.StackTrace;
                _info.Tabela = String.Empty;
                LogLocal.Info = _info;
                LogLocal.Gravar();
                #endregion
            }
            return sucesso;
        }
        bool IPerfilDao<mPerfil>.Alterar(mPerfil infoPerfil)
        {
            bool sucesso = false;
            DbParameter p = null;
            string cmdSQL = String.Empty;

            try
            {
                DbCommand _cmd = EngineBD.GetConexao.CreateCommand();

                _cmd.CommandType = CommandType.Text;
                cmdSQL = cmdUpdateSQL;
                cmdSQL += "WHERE codigo =@PAR_CODIGO AND empresa =@PAR_EMPRESA";
                _cmd.CommandText = cmdSQL;
                
                GeraParametro(ref _cmd, infoPerfil, 2);

                p = _cmd.CreateParameter();
                p.ParameterName = "@PAR_CODIGO";
                p.Value = infoPerfil.Codigo;
                _cmd.Parameters.Add(p);

                p = _cmd.CreateParameter();
                p.ParameterName = "@PAR_EMPRESA";
                p.Value = infoPerfil.CodigoEmpresa;
                _cmd.Parameters.Add(p);

                _cmd.Prepare();

                sucesso = EngineBD.ExecuteNonQuery(_cmd);                
            }
            catch (Exception ex)
            {
                #region Grava log local
                mLog _info = new mLog();
                _info._TipoErro = TipoErro.Erro;
                _info.Mensagem = "Erro ao executar comando. " + ex.Message;
                _info.Metodo = "bool IPerfilDao<mPerfil>.Alterar(mPerfil infoPerfil)";
                _info.StackTrace = ex.StackTrace;
                _info.Tabela = String.Empty;
                LogLocal.Info = _info;
                LogLocal.Gravar();
                #endregion
            }
            return sucesso;
        }
        bool IPerfilDao<mPerfil>.Excluir(mPerfil InfoPerfil)
        {
            bool sucesso = false;
            DbParameter p = null;
            string cmdSQL;

            try
            {
                DbCommand _cmd = EngineBD.GetConexao.CreateCommand();

                _cmd.CommandType = CommandType.Text;
                cmdSQL = cmdDeleteSQL;
                cmdSQL += "WHERE codigo =@PAR_CODIGO AND empresa =@PAR_EMPRESA";
                _cmd.CommandText = cmdSQL;

                p = _cmd.CreateParameter();
                p.ParameterName = "@PAR_CODIGO";
                p.Value = infoPerfil.Codigo;
                _cmd.Parameters.Add(p);

                p = _cmd.CreateParameter();
                p.ParameterName = "@PAR_EMPRESA";
                p.Value = infoPerfil.CodigoEmpresa;
                _cmd.Parameters.Add(p);

                _cmd.Prepare();

                sucesso = EngineBD.ExecuteNonQuery(_cmd);       
            }
            catch (Exception ex)
            {
                #region Grava log local
                mLog _info = new mLog();
                _info._TipoErro = TipoErro.Erro;
                _info.Mensagem = "Erro ao executar comando. " + ex.Message;
                _info.Metodo = "bool IPerfilDao<mPerfil>.Excluir(int Indice, short Empresa)";
                _info.StackTrace = ex.StackTrace;
                _info.Tabela = String.Empty;
                LogLocal.Info = _info;
                LogLocal.Gravar();
                #endregion
            }
            return sucesso;
        }
        
        mPerfil IPerfilDao<mPerfil>.GetPerfil(int Codigo, short Empresa)
        {
            infoPerfil = new mPerfil();
            DbDataReader rd = null;
            DbCommand _cmd = null;
            DbParameter p = null;
            string cmdSQL;

            try
            {
                _cmd = EngineBD.GetConexao.CreateCommand();

                _cmd.CommandType = CommandType.Text;
                cmdSQL = cmdSelectSQL;
                cmdSQL += "WHERE codigo =@PAR_CODIGO AND empresa =@PAR_EMPRESA";
                _cmd.CommandText = cmdSQL;

                p = _cmd.CreateParameter();
                p.ParameterName = "@PAR_CODGIO";
                p.Value = Codigo;
                _cmd.Parameters.Add(p);

                p = _cmd.CreateParameter();
                p.ParameterName = "@PAR_EMPRESA";
                p.Value = Empresa;
                _cmd.Parameters.Add(p);

                rd = EngineBD.ExecuteDataReader(_cmd);

                if (rd.Read())
                    infoPerfil = GetRd(rd);

                return infoPerfil;
            }
            catch (Exception ex)
            {
                #region Grava log local
                mLog _info = new mLog();
                _info._TipoErro = TipoErro.Erro;
                _info.Mensagem = "Erro ao executar comando. " + ex.Message;
                _info.Metodo = "mPerfil IPerfilDao<mPerfil>.GetUsuario(int Codigo, short Empresa)";
                _info.StackTrace = ex.StackTrace;
                _info.Tabela = String.Empty;
                LogLocal.Info = _info;
                LogLocal.Gravar();
                #endregion
            }
            finally
            {
                rd.Close();
            }
            return infoPerfil;
        }

        List<mPerfil> IPerfilDao<mPerfil>.GetLista(short Empresa)
        {
            mPerfil infoPerfil;
            List<mPerfil> lst = new List<mPerfil>();
            DbDataReader rd = null;
            DbCommand _cmd = null;
            DbParameter p = null;
            string cmdSQL;

            try
            {
                _cmd = EngineBD.GetConexao.CreateCommand();

                _cmd.CommandType = CommandType.Text;
                cmdSQL = cmdSelectSQL;
                cmdSQL += "WHERE empresa =@PAR_EMPRESA ";

                cmdSQL += "ORDER BY descricao";
                _cmd.CommandText = cmdSQL;

                p = _cmd.CreateParameter();
                p.ParameterName = "@PAR_EMPRESA";
                p.Value = Empresa;
                _cmd.Parameters.Add(p);

                rd = EngineBD.ExecuteDataReader(_cmd);

                while (rd.Read())
                {
                    infoPerfil = new mPerfil();
                    infoPerfil.Codigo = Convert.ToInt32(rd["codigo"]);
                    infoPerfil.Descricao = rd["descricao"].ToString();
                    infoPerfil.DataCadastro = Convert.ToDateTime(rd["datacadastro"]);
                    infoPerfil.DataAlteracao = Convert.ToDateTime(rd["dataalteracao"]);
                    infoPerfil.Ativo = Convert.ToBoolean(rd["ativo"]);
                    lst.Add(infoPerfil);
                }
                return lst;
            }
            catch (Exception ex)
            {
                #region Grava log local
                mLog _info = new mLog();
                _info._TipoErro = TipoErro.Erro;
                _info.Mensagem = "Erro ao executar comando. " + ex.Message;
                _info.Metodo = "mPerfil IPerfilDao<mPerfil>.GetLista(int Codigo, short Empresa)";
                _info.StackTrace = ex.StackTrace;
                _info.Tabela = String.Empty;
                LogLocal.Info = _info;
                LogLocal.Gravar();
                #endregion
            }
            finally
            {
                rd.Close();
            }
            return lst;
        }
        #endregion

        #region Metodos privados
        private mPerfil GetRd(DbDataReader rd)
        {
            infoPerfil = new mPerfil();

            infoPerfil.Codigo = Convert.ToInt32(rd["codigo"]);
            infoPerfil.DataCadastro = Convert.ToDateTime(rd["datacadastro"]);
            infoPerfil.CodigoEmpresa = Convert.ToInt16(rd["empresa"]);
            infoPerfil.DataAlteracao = Convert.ToDateTime(rd["dataalteracao"]);
            infoPerfil.Ativo = Convert.ToBoolean(rd["ativo"]); 
            infoPerfil.Descricao = rd["descricao"].ToString();
    
            return infoPerfil;
        }
        private void GeraParametro(ref DbCommand _cmd, mPerfil infoPerfil, byte Acao)
        {
            _cmd.Parameters.Clear();
            JMIUtil jmiUtil = new JMIUtil();

            if (Acao == 1)
            {
                infoPerfil.Codigo = UtilBD.GetID(EngineBD.GetConexao, "cadastro.perfil", "codigo", infoPerfil.CodigoEmpresa);
                UtilBD.AdicionaParametro(ref _cmd, "@codigo", infoPerfil.Codigo);
                UtilBD.AdicionaParametro(ref _cmd, "@empresa", infoPerfil.CodigoEmpresa);
            }
            UtilBD.AdicionaParametro(ref _cmd, "@datacadastro", infoPerfil.DataCadastro);
            UtilBD.AdicionaParametro(ref _cmd, "@dataalteracao", infoPerfil.DataAlteracao);
            UtilBD.AdicionaParametro(ref _cmd, "@ativo", infoPerfil.Ativo);
            UtilBD.AdicionaParametro(ref _cmd, "@descricao", infoPerfil.Descricao);
        }
        #endregion
    }
}
